<?php

namespace App\Jobs;

use App\Models\SiteGold;
use App\Models\UserGold;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Service\Log\LogFile;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class TaskJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $param;

    //  【深蓝汇】
    // 用户任务完成（用户完成任务获取金币）
    /*
     * 一直保持运行，直到它被手动停止或你关闭你的终端
     * php artisan queue:work --queue=member_task
     * sudo -u www php /www/wwwroot/slh/laravel.test/artisan queue:work --queue=member_task
     * sudo -u www php /www/wwwroot/slh/laravel.test/artisan queue:work --queue=member_task --once
     * sudo -u www php /www/wwwroot/shenlanhui/laravel/artisan queue:work --queue=member_task --once
     * php artisan queue:work --daemon
     *
     * php artisan queue:listen  --queue=member_task
     */

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($param = '')
    {
        $this->param = $param;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $uid   = $this->param['uid'] ?? 0;
        $field = $this->param['field'] ?? 0;
        // 参数不齐全，不能执行
        if(empty($uid) || empty($field)){
            return $this->delete();
        }

        $logger = new LogFile();
        $logger->write('队列任务执行：用户'.$uid.'完成任务'.$field, 'info');
        // return $this->release(10 * $attempts);
        // 避免过大，一直占用
        $attempts = $this->attempts();
        if($attempts > 50){
            return $this->delete();
        }

        // 获取任务
        $goldDb   = new SiteGold();
        $taskInfo = $goldDb->isCache(false)->oneFind(['field' => $field]);
        // 如果任务不存在
        if(empty($taskInfo)){
            return $this->delete();
        }

        $uGoldDb = new UserGold();
        try{
            // 判断任务是否完成（如果任务完成）
            $res = $uGoldDb->isFinish($taskInfo, $uid, true);
            if($res){
                $logger->write('队列任务执行：用户'.$uid.'已经完成任务'.$field, 'info');

                return $this->delete();
            }

            // 执行操作 如果成功
            $logger->write('队列任务执行：用户'.$uid.'执行任务'.$field, 'info');
            $result = $uGoldDb->addUserGold($taskInfo, $uid);
        } catch(\Exception $e){
            // 如果执行失败
            $logger->write('队列【'.__CLASS__.'】:执行异常：'.$uGoldDb->getError());

            return $this->release(10 * $attempts);
        }

        return $this->delete();
    }
}
